package com.atguigu.gmall.user.controller;

import com.atguigu.gmall.common.constant.RedisConst;
import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.common.util.AuthContextHolder;
import com.atguigu.gmall.model.user.UserInfo;
import com.atguigu.gmall.user.service.LoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpCookie;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * @author Administrator
 * @create 2020-05-24 20:20
 */
@RestController
@RequestMapping("/api/user/passport")
public class LoginApiController {

    @Autowired
    private LoginService loginService;
    @Autowired
    private RedisTemplate redisTemplate;

    //1.登录验证
    @PostMapping("/login")
    public Result login(@RequestBody UserInfo userInfo){
        //1:判断用户名不能为空
        //2:判断密码不能为空
        //3:判断用户名密码是否正确  连接DB  返回值要求必须有昵称
        UserInfo userInfo1 = loginService.login(userInfo);
        if(null == userInfo1){
            return Result.fail().message("此用户名或密码不正确");
        }else{
            //判断用户名或密码成功之后
            //生成令牌  将来是要保存在Cookie中的
            String token = UUID.randomUUID().toString().replaceAll("-","");
            //保存令牌（Redis)
            redisTemplate.opsForValue().set(RedisConst.USER_LOGIN_KEY_PREFIX + token,
                    userInfo1.getId().toString(),RedisConst.USERKEY_TIMEOUT, TimeUnit.SECONDS);
            //返回成功 200  信息是令牌
            Map map = new HashMap<>();
            map.put("token",token);
            map.put("nickName",userInfo1.getNickName());
            return Result.ok(map);
        }
    }

    //退出
    @GetMapping("/logout")
    public Result logout(ServerHttpRequest reqt,HttpServletRequest request){

        //1:获取令牌  1） 请求头中  2） Cookie中
        String token = reqt.getHeaders().getFirst("token");
        redisTemplate.delete(RedisConst.USER_LOGIN_KEY_PREFIX + token);
        //销毁session对象
        request.getSession().invalidate();
        //重定向到登录页面
        return Result.ok();
    }


}
